package dawi.fcs.servicio.generico;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import dawi.fcs.dominio.generico.GenericoBean;

public abstract class GenericoDaoImpl implements GenericoDao{
	public String nombreAlias;
	public SqlSession session;

	public GenericoDaoImpl() {
	}

	public GenericoDaoImpl(SqlSession sqlSession, String nombreAlias) {
		this.nombreAlias = nombreAlias;
		this.session = sqlSession;

	}

	public void registrar(GenericoBean bean) {
		this.session.insert(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_REGISTRAR, bean);
	}
	
	public void ejecutarRegistro(GenericoBean bean,String query) {
		this.session.insert(query, bean);
	}

	public void actualizar(GenericoBean bean) {
		this.session.update(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_ACTUALIZAR, bean);
	}

	public void eliminar(GenericoBean pk) {
		this.session.delete(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_ELIMINAR, pk);
	}

	public GenericoBean obtenerPorId(GenericoBean pk) {
		Object resultado;
		resultado = this.session.selectOne(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_OBTENERPORID, pk);
		return (GenericoBean) resultado;
	}

	public GenericoBean obtenerPorId(String nombreQuery, GenericoBean bean) {
		Object resultado;
		resultado = this.session.selectOne(nombreQuery, bean);
		return (GenericoBean) resultado;
	}

	@SuppressWarnings("unchecked")
	public List<GenericoBean> listarTodos() {
		List<GenericoBean> resultado = null;
		resultado = this.session.selectList(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_LISTARTODOS);
		return resultado;
	}

	@SuppressWarnings("unchecked")
	public List<GenericoBean> listarPorEjemplo(GenericoBean bean) {
		List<GenericoBean> resultado = null;
		resultado = this.session.selectList(nombreAlias + "."
				+ Constante.CONSTANTE_MYBATIS_OPERACION_LISTARPOREJEMPLO, bean);
		return resultado;
	}

	public GenericoBean ejecutarPorQuery(String nombreQuery, GenericoBean bean) {
		this.session.update(nombreQuery, bean);
		return bean;
	}

	@SuppressWarnings("rawtypes")
	public HashMap ejecutarPorQuery(String nombreQuery, HashMap map) {
		this.session.update(nombreQuery, map);
		return map;
	}

	@SuppressWarnings("unchecked")
	public List<GenericoBean> listarPorQuery(String nombreQuery) {
		List<GenericoBean> resultado = null;
		resultado = this.session.selectList(nombreQuery);
		return resultado;
	}

	@SuppressWarnings("unchecked")
	public List<GenericoBean> listarPorQuery(String nombreQuery,
			GenericoBean bean) {
		List<GenericoBean> resultado = null;
		resultado = this.session.selectList(nombreQuery, bean);
		return resultado;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<GenericoBean> listarPorQuery(String nombreQuery, HashMap map) {
		List<GenericoBean> resultado = null;
		resultado = this.session.selectList(nombreQuery, map);
		return resultado;
	}

	public Integer contar(String nombreQuery, GenericoBean bean) {
		Integer obj;
		obj = (Integer) this.session.selectOne(nombreQuery, bean);
		return obj.intValue();
	}
	
	@SuppressWarnings("rawtypes")
	public Integer contar(String nombreQuery, HashMap map) {
		Integer obj;
		obj = (Integer) this.session.selectOne(nombreQuery, map);
		return obj.intValue();
	}

	public Object obtenerValor(String nombreQuery, HashMap map){
		Object obj;
		obj = this.session.selectOne(nombreQuery, map);
		System.out.println(obj);
		return obj;
	}
}
